package com.neno0o.ubersdk;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.neno0o.ubersdk.Auth.Models.AccessToken;
import com.neno0o.ubersdk.Auth.Service.UberAuthService;
import com.neno0o.ubersdk.Endpoints.Service.UberAPIService;
import com.neno0o.ubersdk.Exceptions.ForbiddenException;
import com.neno0o.ubersdk.Exceptions.UnauthorizedException;
import com.neno0o.ubersdk.Sandbox.Service.UberSandboxService;
import java.lang.reflect.Type;
import java.util.Date;
import retrofit.ErrorHandler;
import retrofit.RequestInterceptor;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.converter.GsonConverter;
/**
* Uber client object implements singleton.
*
* This class provides a way to access its only object which can be accessed directly without
* need to instantiate the object of the class.
*/
public class Uber {
/**
* An object of Uber
*/
private static Uber uber = new Uber();
/**
* Uber app PARAMETERS
*/
private String clientId;
private String clientSecret;
private String serverToken;
private String clientRedirectUri;
private String responeType = "code";
private String grantType = "authorization_code";
/**
* Exchanging this authorization code for an access_token, which will allow to make requests on behalf of a user.
* The access_token expires in 30 days. The grant_type may be authorization_code or refresh_token.
*/
private AccessToken accessToken;
/**
* APIs Services
*/
private UberAuthService uberAuthService;
private UberAPIService uberAPIService;
private UberSandboxService uberSandboxService;
private Gson gson;
/**
* Returns an instance associated with the uber configuration bound to this class.
*
* @return default singleton instance
*/
public static Uber getInstance() {
return uber;
}
/**
* initialize Uber app by constructing all APIs services
*
* @param clientId A 32 character string (public)
* @param clientSecret A 40 character string. DO NOT SHARE.
* This should not be available on any public facing server or web site.
* If you have been compromised or shared this token accidentally please reset your client_secret
* via our web interface. This will require updating your application to use the newly issued client_secret.
* @param serverToken A 40 character string. DO NOT SHARE.
* This must be used for requests that are not issued on behalf of a User.
* @param clientRedirectUri These URLs will be used during OAuth Authentication. To learn more about using OAuth please refer to OAuth Guide.
*/
public void init(String clientId, String clientSecret, String serverToken, String clientRedirectUri) {
this.clientId = clientId;
this.clientSecret = clientSecret;
this.serverToken = serverToken;
this.clientRedirectUri = clientRedirectUri;
GsonBuilder gsonBuilder = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return new Date(json.getAsJsonPrimitive().getAsLong());
}
});
gson = gsonBuilder.create();
RestAdapter apiRestAdapter = new RestAdapter.Builder()
.setEndpoint(UberURLs.API_URL)
.setConverter(new GsonConverter(gson))
.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
if (hasAccessToken()) {
request.addHeader("Authorization", "Bearer " + getAccessToken().getAccessTokenValue());
return;
} else if (hasServerToken()) {
request.addHeader("Authorization", "Token " + getServerToken());
}
}
})
.setErrorHandler(new ErrorHandler() {
@Override
public Throwable handleError(RetrofitError retrofitError) {
if (retrofitError != null && retrofitError.getResponse() != null) {
switch (retrofitError.getResponse().getStatus()) {
case 401: //Unauthorized
return new UnauthorizedException();
case 403: //Forbidden
return new ForbiddenException();
}
}
return retrofitError;
}
})
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
uberAPIService = apiRestAdapter.create(UberAPIService.class);
RestAdapter authRestAdapter = new RestAdapter.Builder()
.setEndpoint(UberURLs.OAUTH_URL)
.setLogLevel(BuildConfig.DEBUG ? RestAdapter.LogLevel.FULL : RestAdapter.LogLevel.NONE)
.setConverter(new GsonConverter(gson))
.build();
uberAuthService = authRestAdapter.create(UberAuthService.class);
RestAdapter sandboxRestAdapter = new RestAdapter.Builder()
.setEndpoint(UberURLs.SANDBOX_URL)
.setLogLevel(BuildConfig.DEBUG ? RestAdapter.LogLevel.FULL : RestAdapter.LogLevel.NONE)
.setConverter(new GsonConverter(gson))
.build();
uberSandboxService = sandboxRestAdapter.create(UberSandboxService.class);
}
public String getClientId() {
return this.clientId;
}
public String getClientSecret() {
return this.clientSecret;
}
public String getServerToken() {
return serverToken;
}
public String getClientRedirectUri() {
return clientRedirectUri;
}
public String getResponeType() {
return responeType;
}
public String getGrantType() {
return grantType;
}
public boolean hasAccessToken() {
return accessToken != null && accessToken.getAccessTokenValue().length() > 0;
}
public AccessToken getAccessToken() {
return accessToken;
}
public void setAccessToken(AccessToken accessToken) {
this.accessToken = accessToken;
}
public boolean hasServerToken() {
return serverToken != null && serverToken.length() > 0;
}
public UberAPIService getUberAPIService() {
return uberAPIService;
}
public UberAuthService getUberAuthService() {
return uberAuthService;
}
public UberSandboxService getUberSandboxService() {
return uberSandboxService;
}
public Gson getGson() {
return gson;
}
}